磁盘连接的属性

系统调用 open 用于在进程和磁盘文件之间创建一个连接. 该链接含有若干个属性, 下面 先仔细学习其中两个属性

属性1: 缓冲

可以通过修改控制变量改变文件描述符的动作, 列入通过3不操作关闭磁盘缓冲

#include <fcntl.h>
int s;                          // settings
s = fcntl(fd, F_GETFL);         // get flags
s |= O_SYNC;                    // set SYNC bit
result = fcntl(fd, S_SETFL, s); // set flags
if(result == -1)                // if error
   perror("setting SYNC");      // report

文件描述符属性被编码在一个整数的位中. 系统调用 fcntl 通过读写该证书位来控制文件 描述符.

  fcntl
目标 控制文件描述符
头文件 #include <fcntl.h>/#include <unistd.h>/#include <sys/types.h>
原型 int result = fcntl(ind fd, int cmd);
  int result = fcntl(int fd, int cmd, long arg);
  int result = fcntl(int fd, int cmd, struct flock * lockp);
参数 fd 文件描述符/cmd 操作 /arg 操作的参数/ lock 锁信息
返回值 -1 遇到错误 other 依操作而定

设置 O_SYNC 会关闭内核的缓冲机制, 如果没有很充分的理由, 最好不要关闭缓冲.

属性2: 自动添加模式

文件描述符的另一个属性是自动添加模式(auto-append mode).自动添加模式对于若干个 进程在同一时间写入文件是很有用的.

当文件描述符 o_APPEND 位开启后, 每个对 write 的调用自动调用 lseek 将内容添加到 文件的末尾.

下面代码启动自动添加模式, 然后调用 write:

#include <fcntl.h>
int s;
s = fcntl(fd, F_GETFL);
s |= O_APPEND;
result = fcntl(fd, F_SETFL, s);
if (result == -1)
    perror("setting APPEND");
else
    write(fd, &rec, 1);

当 O_APPEND 被置位, 内核将 lseek 和 write 组合成一个原子操作, 被连接成一个不可 分割的单元.

用 open 控制文件描述符

可以通过系统调用 open 的第二个参数的一部分来设置文件描述符的属性位.

fd = open(WTMP_FILE, O_WRONLY | O_APPEND | O_SYNC);

可以通过 open 闯将一个包含 O_CREAT 标志位的文件, 以下两个调用是等价的:

fd = creat(filename, permission_bits);
fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, permission_bits);

open 支持的其他标志位: